﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Helena.Areas.Productos.Models;
using Helena.Areas.Proveedores.Models;
using Helena.Areas.Reportes.Models;
using Helena.Areas.Salidas.Models;
using Telerik.Web.Mvc;

namespace Helena.Areas.Salidas.Controllers
{
    public class DetalleSalidaController : Controller
    {
        LogicaSalida db = new LogicaSalida();
        LogicaProducto pro_db = new LogicaProducto();
        LogicaProveedor pvd_db = new LogicaProveedor();
        LogicaKardex kardex = new LogicaKardex();
        //
        // GET: /Salidas/DetalleSalida/
        #region DetalleEntrada
        public ActionResult Index()
        {
            ObtenerProductos();
            ObtenerProveedores();
            Session["ProveedorID"] = 1;
            int SalidaID = Convert.ToInt16(Session["SalidaSeleccionada"].ToString());

            ViewData["SalidaSeleccionada"] = db.i_RetornarSalida(SalidaID);

            List<ProductoView> productos = pro_db.i_RetornarProductos().Where(p => p.proveedorID == 1).Where(p => p.Estado == true).ToList(); 
            List<DetalleSalidaView> salida = new List<DetalleSalidaView>();
            foreach(ProductoView p in productos)
            {
                DetalleSalidaView d = new DetalleSalidaView();
                d.ProductoID=p.ID;
                d.NombreProducto = p.Descripcion;
                salida.Add(d);
            }
            ViewData["DetalleSalida"]=salida;
            return View();
        }

        [GridAction]
        public ActionResult ObtenerProveedor()
        {
            return View(new GridModel<ProveedorView>
            {
                Data = pvd_db.i_RetornarProveedores().Where(e=>e.Estado==true).ToList()
            });
        }

        [GridAction]
        public ActionResult ObtenerProductos(String ProveedorNombre)
        {
            ProveedorNombre = ProveedorNombre ?? "HELENA TIENDAS S.A.C";
            int ProveedorID = pvd_db.i_RetornarProveedores().Where(p => p.RazonSocial == ProveedorNombre).FirstOrDefault().ID;
            Session["ProveedorID"] = ProveedorID;

            ObtenerSalida();

            return View(new GridModel<DetalleSalidaView>
            {
                Data = (List<DetalleSalidaView>)Session["salida"]
            });
        }

        [GridAction]
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult InsertarDetalleSalida(DetalleSalidaView detalle)
        {
            int ID = Convert.ToInt16(Session["SalidaSeleccionada"].ToString());
            ProductoView p= pro_db.i_RetornarProducto(detalle.ProductoID);
            kardex.IngresarSalida(p, detalle.Cantidad, DateTime.Now);
            
            detalle.NombreProducto = p.Descripcion;
            detalle.ProveedorID = Convert.ToInt16(Session["ProveedorID"].ToString());
            detalle.SalidaID = ID;
            db.AgregarDetalleaSalida(ID,detalle);
            
            ObtenerSalida();
            
            return View(new GridModel((List<DetalleSalidaView>)Session["salida"]));
        }

        [GridAction]
        public ActionResult ObtenerDetalles(string SalidaID )
        {
            Session["SalidaSeleccionada"] = SalidaID;
            int ID = Convert.ToInt16(Session["SalidaSeleccionada"].ToString());
            List<DetalleSalidaView> dl = db.DetallesDeUnaSalida(ID);

            return View(new GridModel<DetalleSalidaView>
            {
                Data = (dl)
            });

        }

        [GridAction]
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult EliminarDetalle(DetalleSalidaView detalle)
        {
            int SalidaID = Convert.ToInt16(Session["SalidaSeleccionada"].ToString());
            DetalleSalidaView detalle_eliminar = db.DetallesDeUnaSalida(SalidaID).Where(d=>d.ID==detalle.ID).FirstOrDefault();
            ProductoView p = pro_db.i_RetornarProductos().Where(y => y.Descripcion == detalle_eliminar.NombreProducto).FirstOrDefault();

            kardex.IngresarSalida(p, -detalle_eliminar.Cantidad, DateTime.Now);
            db.i_EliminarDetalle(SalidaID, detalle_eliminar);
            List<DetalleSalidaView> dl = db.DetallesDeUnaSalida(SalidaID);
            return View(new GridModel(dl));
        }
        #endregion
        
        #region extras

        private void ObtenerProveedores()
        {
            ViewData["Proveedores"] = pvd_db.i_RetornarProveedores();
        }

        private void ObtenerProductos()
        {
            ViewData["Productos"] = pro_db.i_RetornarProductos().Where(d => d.Estado == true).ToList();
        }

        private void ObtenerSalida()
        {
            List<ProductoView> consulta = pro_db.i_RetornarProductos().Where(p => p.proveedorID == Convert.ToInt16(Session["ProveedorID"].ToString())).ToList();
            List<DetalleSalidaView> salida = new List<DetalleSalidaView>();

            foreach (ProductoView s in consulta)
            {
                DetalleSalidaView d = new DetalleSalidaView();
                d.ProductoID = s.ID;
                salida.Add(d);
            }
            Session["salida"] = salida;
        }

        #endregion
    }
}
